home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / example.e < prev    next >
Text File  |  1995-01-26  |  6KB  |  276 lines

  1. OPT PREPROCESS
  2. MODULE '*queuestack'
  3.  
  4. #define SIGNALS
  5.  
  6. #ifdef SIGNALS
  7. MODULE 'other/signal'
  8. #endif
  9.  
  10. OBJECT test1
  11.  a
  12. ENDOBJECT
  13.  
  14. OBJECT test2 OF test1
  15.  b
  16. ENDOBJECT
  17.  
  18. OBJECT test3 OF test2
  19.  c
  20. ENDOBJECT
  21.  
  22.  
  23. DEF queuestack_ctrlc
  24.  
  25. RAISE "^C" IF CtrlC() = TRUE
  26.  
  27. PROC speak() OF test1
  28.  WriteF('I''m from test1!\n')
  29. ENDPROC
  30.  
  31. PROC speak() OF test2
  32.  WriteF('I''m from test2 of test1!\n')
  33. ENDPROC
  34.  
  35. PROC speak() OF test3
  36.  WriteF('I''m from test3 of test2 of test1!\n')
  37. ENDPROC 
  38.  
  39. PROC isEven(i) IS Even(i)
  40.  
  41. PROC print(i)
  42.  WriteF('item = \d\n',i)
  43.  RETURN i
  44. ENDPROC
  45.  
  46. PROC write(i)
  47.  WriteF('-> \s\n',i)
  48. ENDPROC
  49.  
  50. PROC isNegative(i) IS i<0
  51.  
  52. PROC subtractFour(i) IS i - 4
  53.  
  54. #ifdef SIGNALS
  55. PROC pause() HANDLE
  56.  WriteF('<Press ^D to continue>')
  57.  WHILE ctrlD() = NIL
  58.  CtrlC()
  59.  ENDWHILE
  60.  WriteF('\n')
  61. EXCEPT
  62.  WriteF('\n')
  63.  Raise(exception)
  64. ENDPROC
  65. #endif
  66.  
  67. #ifndef SIGNALS
  68. PROC pause() HANDLE
  69.  WriteF('Press ^C to continue>')
  70.  LOOP
  71.   CtrlC()
  72.  ENDLOOP
  73. EXCEPT
  74.  WriteF('\n')
  75. ENDPROC
  76. #endif
  77.  
  78. PROC eh(i,j)
  79.  RETURN i+j
  80. ENDPROC
  81.  
  82. PROC main() HANDLE
  83.  DEF in:PTR TO queuestack,i,j=0,out:PTR TO queuestack,one:PTR TO test1,
  84.      two:PTR TO test2,three:PTR TO test3,moo:PTR TO test1
  85.  
  86.  NEW in.new()
  87.  NEW out.new()
  88.  NEW one
  89.  NEW two
  90.  NEW three
  91.  
  92.  queuestack_ctrlc:=TRUE -> Turn on CtrlC() ability in queuestacks.
  93.  
  94.  WriteF('note: There are four general possible combinations of use.\n')
  95.  WriteF('They''ll influence whether queuestack acts as a queue or a stack.\n')
  96.  WriteF('#1: addFirst/getFirst\n')
  97.  WriteF('addFirsting...\n')
  98.  FOR i:=5 TO 10
  99.   in.addFirst(i)
  100.   WriteF('value = \d\n',i)
  101.   CtrlC()
  102.  ENDFOR
  103.  WriteF('getFirsting...\n')
  104.  WHILE in.getSize()
  105.   WriteF('value = \d\n',in.getFirst())
  106.   CtrlC()
  107.  ENDWHILE
  108.  pause()
  109.  WriteF('#2: addFirst/getLast\n')
  110.  WriteF('addFirsting...\n')
  111.  FOR i:=5 TO 10
  112.   in.addFirst(i)
  113.   WriteF('value = \d\n',i)
  114.   CtrlC()
  115.  ENDFOR
  116.  WriteF('getLasting...\n')
  117.  WHILE in.getSize()
  118.   WriteF('value = \d\n',in.getLast())
  119.   CtrlC()
  120.  ENDWHILE
  121.  pause()
  122.  WriteF('#3: addLast/getFirst\n')
  123.  WriteF('addLasting...\n')
  124.  FOR i:=5 TO 10
  125.   in.addLast(i)
  126.   WriteF('value = \d\n',i)
  127.   CtrlC()
  128.  ENDFOR
  129.  WriteF('getFirsting...\n')
  130.  WHILE in.getSize()
  131.   WriteF('value = \d\n',in.getFirst())
  132.   CtrlC()
  133.  ENDWHILE
  134.  pause()
  135.  WriteF('#4: addLast/getLast\n')
  136.  WriteF('addLasting...\n')
  137.  FOR i:=5 TO 10
  138.   in.addLast(i)
  139.   WriteF('value = \d\n',i)
  140.   CtrlC()
  141.  ENDFOR
  142.  WriteF('getLasting...\n')
  143.  WHILE in.getSize()
  144.   WriteF('value = \d\n',in.getLast())
  145.   CtrlC()
  146.  ENDWHILE
  147.  pause()
  148.  WriteF('Of course, one could do an alternating weirdness...\n')
  149.  WriteF('input:\n')
  150.  j:=FALSE
  151.  FOR i:=10 TO 20
  152.   IF j
  153.    in.addFirst(i)
  154.    j:=FALSE
  155.   ELSE
  156.    in.addLast(i)
  157.    j:=TRUE
  158.   ENDIF
  159.   WriteF('value = \d\n',i)
  160.   CtrlC()
  161.  ENDFOR
  162.  WriteF('output:\n')
  163.  in.do({print})
  164.  WriteF('deallocation:\n')
  165.  END in
  166.  NEW in.new()
  167.  out.new()
  168.  pause()
  169.  WriteF('addFirstQS example:\n')
  170.  FOR i:=1 TO 5
  171.   in.addLast(i)
  172.   out.addLast(i+20)
  173.  ENDFOR
  174.  in.addFirstQS(out)
  175.  WriteF('in:\n')
  176.  in.do({print})
  177.  WriteF('out:\n(should get nothing)\n')
  178.  out.do({print})
  179.  in.new()
  180.  out.new()
  181.  pause()
  182.  WriteF('addLastQS example:\n')
  183.  FOR i:=1 TO 5
  184.   in.addLast(i)
  185.   out.addLast(i+20)
  186.  ENDFOR
  187.  in.addLastQS(out)
  188.  WriteF('in:\n')
  189.  in.do({print})
  190.  WriteF('out:\n(should get nothing)\n')
  191.  out.do({print})
  192.  pause()
  193.  WriteF('Now for something twisted..\n')
  194.  in.inject({eh},10)
  195.  out.addFirstQS(in)
  196.  out.do({print})
  197.  END in
  198.  END out
  199.  pause()
  200.  WriteF('We need some numbers first....\n')
  201.  NEW in.new()
  202.  FOR i:=1 TO 10
  203.   in.addLast(i)
  204.   WriteF('entered \d.\n',i)
  205.  ENDFOR
  206.  WriteF('Make a new list of even numbers from the old list we just made.\n')
  207.  out:=in.select({isEven})
  208.  out.do({print})
  209.  END out
  210.  pause()
  211.  WriteF('Another one...of odd numbers.\n')
  212.  out:=in.rejectBackwards({isEven})
  213.  out.doBackwards({print})
  214.  END in
  215.  pause()
  216.  WriteF('Subtract four from the above:\n')
  217.  in:=out.collect({subtractFour})
  218.  in.doBackwards({print})
  219.  pause()
  220.  WriteF('True or False: all of the above negative?\n')
  221.  IF in.conform({isNegative}) THEN WriteF('True\n') ELSE WriteF('False\n')
  222.  WriteF('True or False: any of the above negative?\n')
  223.  IF in.detect({isNegative}) THEN WriteF('True\n') ELSE WriteF('False\n')
  224.  WriteF('The first value found that is negative is \d.\n',in.detectBackwards({isNegative}))
  225.  pause()
  226.  WriteF('Hmmmm... Let''s do something peculiar...\n')
  227.  END out
  228.  END in
  229.  NEW out.new()
  230.  WriteF('We''ll make a list from 1 to 5, then add each element to the other\n')
  231.  WriteF('as we traverse the queuestack. The last element should be the sum\n')
  232.  WriteF('of all the elements.\n')
  233.  FOR i:=1 TO 5
  234.   out.addLast(i)
  235.  ENDFOR
  236.  out.inject({eh})
  237.  out.do({print})
  238.  pause()
  239.  
  240.  WriteF('But wait.. there''s MORE!\n')
  241.  WriteF('Let''s watch queuestack turn a list into a queuestack!\n')
  242.  NEW in.new()
  243.  in.asQueueStack(['This is the way we wash the weasel,',
  244.            'We wash the weasel,',
  245.           'We wash the weasel,',
  246.           'This is the way we wash the weasel,',
  247.           'So early in the evening.',0])
  248.  
  249.  in.do({write})
  250.  WriteF('\nIsn''t that amazing?\n')
  251.  pause()
  252.  WriteF('It should be possible to convert it back to a regular list again:\n\n')
  253.  j:=in.asList()
  254.  FOR i:=0 TO ListLen(j)-1
  255.   WriteF('\s\n',ListItem(j,i))
  256.  ENDFOR
  257.  pause()
  258.  WriteF('Lastly, let''s look at a polymorphic example.\n')
  259.  WriteF('Three different objects derived from test1 will be entered into the\n')
  260.  WriteF('QueueStack... all of them have their own ''speak()'' method.\n')
  261.  WriteF('Let''s read what they have to say.\n\n')
  262.  END out
  263.  NEW out.new()
  264.  out.addFirst(one)
  265.  out.addFirst(two)
  266.  out.addFirst(three)
  267.  WHILE out.getSize()
  268.   moo:=out.getLast()
  269.   moo.speak()
  270.  ENDWHILE
  271.  WriteF('\nEnd of example.\n')
  272. EXCEPT
  273.  IF exception = "^C" THEN WriteF('*** Break\n')
  274.  IF exception = "GURU" THEN WriteF('Guru.\n')
  275. ENDPROC
  276.